//  1.导入axios
import axios from 'axios'
import store from '@/store/index.js'
import { localSet } from '@/utils/mylocal.js'
// 导入jsonbigint
import jsonbig from 'json-bigint'
// 2.实例化axios
const instance = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn',
  transformResponse: [function (data) {
    try {
    // data就是响应回来的json格式的字符串
      return jsonbig.parse(data)
    } catch (err) {
      return data
    }
  }]
})

// 再创建一个对象:用来处理token
const instanceToken = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn'
})

// 添加请求拦截器http request
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  const token = store.state.userInfo.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器http respones
instance.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  // 得到当前请求返回的错误信息
  window.console.log('-------------------响应拦截-------------------------')
  // 判断错误状态是否是401
  if (error.response.status === 401) {
    // 得到refresh_token
    const refreshToken = store.state.userInfo.refresh_token
    // 将refresh_token提交到服务器
    const res = await instanceToken({
      url: '/app/v1_0/authorizations',
      method: 'put',
      headers: {
        Authorization: `Bearer ${refreshToken}`
      }
    })
    // 保存更新后的token
    const token = res.data.data.token
    // 生成一个新对象
    var objToken = {
      token: token,
      refresh_token: refreshToken
    }
    // 保存到vuex中
    store.commit('setUserInfo', objToken)
    // 保存到localstoreage中
    localSet(objToken)
    // 继续之前完成之前的报错请求
    return await instance(error.config)
  }
  window.console.log('--------------------------------------------------')
  return Promise.reject(error)
})

export default instance
